/**axios封装
 * 请求拦截、相应拦截、错误统一处理
 */
import axios from 'axios'
import { useAuthStore } from '@/stores/useAuthStore'
import { useRouter } from 'vue-router'

axios.defaults.baseURL = 'http://127.0.0.1:8080/'
axios.defaults.timeout = 60000 // 请求超时时间

axios.interceptors.request.use(
  async config => {
    const useAuthStoreData = useAuthStore()
    if (useAuthStoreData.getAuthenticated) {
      let user = useAuthStoreData.getUser
      config.headers.authorization = user.tokenHead + user.token // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
axios.interceptors.response.use(
  response => {
    if (response.status === 200) {
      if (response.data.code === 401) {
        sessionStorage.clear()
        window.location.href = '/login '
        return Promise.reject(response) //失败
      }
      return Promise.resolve(response.data) //进行中
    } else {
      return Promise.reject(response) //失败
    }
  },
  // 服务器状态码不是200的情况
  error => {
    if (error.response.status) {
      const router = useRouter()
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面，并携带当前页面的路径
        // 在登录成功后返回当前页面，这一步需要在登录页操作。
        case 401:
          break
        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 403:
          sessionStorage.clear()
          router.push('/login')
          break
        // 404请求不存在
        case 404:
          router.push('/404')
          break
        // 其他错误，直接抛出错误提示
        default:
      }
      return Promise.reject(error.response)
    }
  }
)

export default axios
